--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
scripts/live_auto_propagation_observe.py e41daa5b65e07a5baa1aaad32d97f90482f1cd1c (e41daa5b) Text, 6.78 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Live observation of AutoPropagationManager against a shared rnsd instance.
Usage (from repo root, with rnsd already running as shared instance)::
MESHCHAT_LANDLOCK=0 MESHCHAT_SECCOMP=0 uv run python scripts/live_auto_propagation_observe.py
"""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787asyncio
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787time
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72import T7ee787RNS
Te6edf3ROOT Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Tffa657strTb4b4b4(Te6edf3ROOTTb4b4b4) Tff7b72not Tff7b72in Te6edf3sysTff7b72.Td2a8ffpathTb4b4b4:
Te6edf3sysTff7b72.Td2a8ffpathTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Tffa657strTb4b4b4(Te6edf3ROOTTb4b4b4)Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat T8b949e# noqa: E402
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787auto_propagation_manager Tff7b72import Tb4b4b4( T8b949e# noqa: E402
Te6edf3MEMORY_CONFIG_KEYTb4b4b4,
Te6edf3AutoPropagationManagerTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ff_prettyTb4b4b4(Te6edf3node_hexTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Tff7b72not Te6edf3node_hexTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff(none)Ta5d6ff"
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3node_hexTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Te6edf3node_hexTb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4] Tff7b72+ Ta5d6ff"Ta5d6ff...Ta5d6ff"
Tff7b72async Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3reticulum_config_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~/.reticulumTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3PathTb4b4b4(Te6edf3reticulum_config_dirTb4b4b4, Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFAIL: missing ~/.reticulum/config (need shared rnsd)Ta5d6ff"Tb4b4b4)
Tff7b72return T79c0ff2
Te6edf3tmp Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Te6edf3prefixTff7b72=Ta5d6ff"Ta5d6ffmcx-live-autoprops-Ta5d6ff"Tb4b4b4)
Te6edf3log_path Tff7b72= Te6edf3PathTb4b4b4(Te6edf3tmpTb4b4b4) Tff7b72/ Ta5d6ff"Ta5d6ffobserve.jsonTa5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fftemp storage: Tffd700{Te6edf3tmpTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffreticulum config: Tffd700{Te6edf3reticulum_config_dirTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3tmpTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3reticulum_config_dirTb4b4b4,
Te6edf3defer_network_setupTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3headlessTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3plugins_enabledTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3reportTb4b4b4: Tffa657dict Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffstarted_atTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffnetwork_readyTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_wait_sTa5d6ff"Tb4b4b4: T79c0ff45Tb4b4b4,
Ta5d6ff"Ta5d6ffpropagation_announcesTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffcandidatesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffbefore_preferredTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffafter_preferredTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffmemoryTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpath_okTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Tb4b4b4}
Tff7b72tryTb4b4b4:
Te6edf3ready Tff7b72= Te6edf3appTff7b72.Td2a8ffwait_until_network_readyTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff90Tb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_readyTa5d6ff"Tb4b4b4] Tff7b72= Tffa657boolTb4b4b4(Te6edf3readyTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffnetwork_ready=Tffd700{Te6edf3readyTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3readyTb4b4b4:
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffnetwork_not_readyTa5d6ff"
Te6edf3log_pathTff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72return T79c0ff1
Te6edf3ctx Tff7b72= Te6edf3appTff7b72.Td2a8ffcurrent_context
Tff7b72if Te6edf3ctx Tff7b72is Tff7b72None Tff7b72or Te6edf3ctxTff7b72.Td2a8ffauto_propagation_manager Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffno_auto_propagation_managerTa5d6ff"
Te6edf3log_pathTff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72return T79c0ff1
Te6edf3managerTb4b4b4: Te6edf3AutoPropagationManager Tff7b72= Te6edf3ctxTff7b72.Td2a8ffauto_propagation_manager
Te6edf3ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_preferred_propagation_node_auto_selectTff7b72.Td2a8ffsetTb4b4b4(Tff7b72TrueTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffwaiting Tffd700{Te6edf3reportTb4b4b4[Ta5d6ff'Ta5d6ffannounce_wait_sTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ffs for lxmf.propagation announces...Ta5d6ff"Tb4b4b4)
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffannounce_wait_sTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3announces Tff7b72= Tb4b4b4(
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announcesTb4b4b4(Te6edf3aspectTff7b72=Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"Tb4b4b4) Tff7b72or Tb4b4b4[Tb4b4b4]
Tb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_announcesTa5d6ff"Tb4b4b4] Tff7b72= Tffa657lenTb4b4b4(Te6edf3announcesTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffpropagation announces stored: Tffd700{Tffa657lenTb4b4b4(Te6edf3announcesTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3bestTb4b4b4, Te6edf3announced Tff7b72= Te6edf3managerTff7b72.Td2a8ff_collect_candidatesTb4b4b4(Tb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffcandidatesTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3bestTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffannounced_countTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3announcedTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsampleTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4: Te6edf3_prettyTb4b4b4(Te6edf3hTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4: Te6edf3hops Tff7b72if Te6edf3hops Tff7b72< T79c0ff10Tff7b72*Tff7b72*T79c0ff8 Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffannouncedTa5d6ff"Tb4b4b4: Te6edf3h Tff7b72in Te6edf3announcedTb4b4b4,
Ta5d6ff"Ta5d6ffpath_okTa5d6ff"Tb4b4b4: Te6edf3managerTff7b72.Td2a8ff_path_quality_okTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3hTb4b4b4, Te6edf3hops Tff7b72in Tffa657listTb4b4b4(Te6edf3bestTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]
Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffcandidates=Tffd700{Tffa657lenTb4b4b4(Te6edf3bestTb4b4b4)Tffd700}Ta5d6ff announced=Tffd700{Tffa657lenTb4b4b4(Te6edf3announcedTb4b4b4)Tffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffsample=Tffd700{Te6edf3reportTb4b4b4[Ta5d6ff'Ta5d6ffcandidatesTa5d6ff'Tb4b4b4]Tb4b4b4[Ta5d6ff'Ta5d6ffsampleTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3before Tff7b72= Te6edf3ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffbefore_preferredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3before
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffbefore preferred: Tffd700{Te6edf3_prettyTb4b4b4(Te6edf3beforeTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3t0 Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3managerTff7b72.Td2a8ffcheck_and_update_propagation_nodeTb4b4b4(Tb4b4b4)
Te6edf3elapsed Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3t0
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffcheck_elapsed_sTa5d6ff"Tb4b4b4] Tff7b72= Tffa657roundTb4b4b4(Te6edf3elapsedTb4b4b4, T79c0ff2Tb4b4b4)
Te6edf3after Tff7b72= Te6edf3ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffafter_preferredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3after
Te6edf3raw_mem Tff7b72= Te6edf3ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetTb4b4b4(Te6edf3MEMORY_CONFIG_KEYTb4b4b4, Te6edf3default_valueTff7b72=Tff7b72NoneTb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffmemoryTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3raw_memTb4b4b4) Tff7b72if Te6edf3raw_mem Tff7b72else Tb4b4b4{Tb4b4b4}
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffafter preferred: Tffd700{Te6edf3_prettyTb4b4b4(Te6edf3afterTb4b4b4)Tffd700}Ta5d6ff (Tffd700{Te6edf3elapsedTffd700:Ta5d6ff.1fTffd700}Ta5d6ffs)Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3afterTb4b4b4:
Te6edf3dest Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3afterTb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffpath_okTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3managerTff7b72.Td2a8ff_path_quality_okTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3managerTff7b72.Td2a8ff_hops_toTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3outbound Tff7b72= Te6edf3ctxTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTb4b4b4(Tb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffoutbound_matchesTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4(
Te6edf3outbound Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3outboundTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3afterTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffpath_ok=Tffd700{Te6edf3reportTb4b4b4[Ta5d6ff'Ta5d6ffpath_okTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff hops=Tffd700{Te6edf3reportTb4b4b4[Ta5d6ff'Ta5d6ffhopsTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffoutbound_matches=Tffd700{Te6edf3reportTb4b4b4[Ta5d6ff'Ta5d6ffoutbound_matchesTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# Second pass should stay sticky without thrashing when recently verified.
Tff7b72if Te6edf3afterTb4b4b4:
Tff7b72await Te6edf3managerTff7b72.Td2a8ffcheck_and_update_propagation_nodeTb4b4b4(Tb4b4b4)
Te6edf3sticky Tff7b72= Te6edf3ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffsticky_preferredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3sticky
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6ffsticky_okTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3sticky Tff7b72== Te6edf3after
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffsticky preferred: Tffd700{Te6edf3_prettyTb4b4b4(Te6edf3stickyTb4b4b4)Tffd700}Ta5d6ff ok=Tffd700{Te6edf3reportTb4b4b4[Ta5d6ff'Ta5d6ffsticky_okTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3log_pathTff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff--- report ---Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3bestTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6ff"Ta5d6ffNOTE: no enabled lxmf.propagation candidates heard yet. Ta5d6ff"
Ta5d6ff"Ta5d6ffLogic ran, but live selection could not be proven this cycle.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72return T79c0ff0
Tff7b72if Te6edf3after Tff7b72and Te6edf3reportTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpath_okTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3reportTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffoutbound_matchesTa5d6ff"Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPASS: selected verified preferred peer with usable pathTa5d6ff"Tb4b4b4)
Tff7b72return T79c0ff0
Tff7b72if Te6edf3afterTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPARTIAL: preferred set but path/outbound not fully confirmedTa5d6ff"Tb4b4b4)
Tff7b72return T79c0ff0
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNOTE: check finished without selecting a preferred peerTa5d6ff"Tb4b4b4)
Tff7b72return T79c0ff0
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Te6edf3reportTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tffa657typeTb4b4b4(Te6edf3excTb4b4b4)Tff7b72.Td2a8ff__name__Tffd700}Ta5d6ff: Tffd700{Te6edf3excTffd700}Ta5d6ff"
Te6edf3log_pathTff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3reportTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72finallyTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657getattrTb4b4b4(Te6edf3appTb4b4b4, Ta5d6ff"Ta5d6ffcurrent_contextTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffreport file: Tffd700{Te6edf3log_pathTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Tff7b72raise Tf85149SystemExitTb4b4b4(Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4(Te6edf3mainTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────